const inquirer = require('inquirer');
const chalk = require('chalk');
const ora = require('ora');
const download = require('download-git-repo');
const handlebars = require('handlebars');
const symbols = require('log-symbols');
const fs = require('fs-extra');

// 用户交互的信息处理
const prompts = [
    {
        type:'input', // 问题类型为填空题
        message:'工程名:', // 问题描述
        name:'projectName', // 问题答案对应的属性，用户输入的内容被存储在then方法中第一个参数对应的该属性中
        validate: val =>{ // 对输入的值做判断
            if(val === ''){
                return chalk.red('项目名不能为空，请重新输入');
            }
            if (fs.existsSync(val)) {
                return chalk.red('项目已存在，请重新输入');
            }
            return true;
        }
    }, {
        type:'input', // 问题类型为填空题
        message:'作者:', // 问题描述
        name:'author'
    }, {
        type:'input', // 问题类型为填空题
        message:'描述信息:', // 问题描述
        name:'description' // 问题答案对应的属性，用户输入的内容被存储在then方法中第一个参数对应的该属性中
    }
];
function replaceTemplates (answers) {
    const fileName = `${answers.projectName}/package.json`;
    const meta = {
        name: answers.projectName,
        description: answers.description,
        author: answers.author
    }
    if (fs.existsSync(fileName)) {
        const content = fs.readFileSync(fileName).toString();
        const result = handlebars.compile(content)(meta);
        fs.writeFileSync(fileName, result);
    }
}
module.exports = () => {
    inquirer.prompt(prompts).then(answers => {
        const gitUrl = 'https://gitee.com/www-ly-cn/templates.git';
        download(`direct:${gitUrl}`,
            answers.projectName,
            { clone: true },
            err => {
                const spinner = ora('正在下载模板...');
                spinner.start();
                if (!err) {
                    spinner.succeed();
                    replaceTemplates(answers);
                    console.log(symbols.success, chalk.green('项目初始化完成'));
                } else {
                    spinner.fail();
                    console.log(symbols.error, chalk.red(`拉取远程仓库失败 ${err}`));
                }
        });
    });
}